const fs = require('fs');
const path = require('path');

// 1. 处理命令行参数（获取要删除的目标路径）
const targetPath = process.argv[2] 
  ? path.join(__dirname, process.argv[2]) 
  : null;

// 验证参数是否存在
if (!targetPath) {
  console.error('错误：请传入要删除的文件或文件夹名称作为参数');
  console.error('使用方式：node delManager.js 目标名称（如 node delManager.js test.txt 或 node delManager.js testDir）');
  process.exit(1); // 退出程序（状态码1表示错误）
}

// 2. 主函数：判断目标类型并执行删除
async function deleteTarget() {
  try {
    // 获取目标状态（fs.statSync 同步方法，便于流程控制）
    const stats = fs.statSync(targetPath);

    if (stats.isFile()) {
      // 情况1：目标是文件，直接删除
      await deleteFile(targetPath);
      console.log(`成功删除文件：${targetPath}`);
    } else if (stats.isDirectory()) {
      // 情况2：目标是文件夹，递归删除
      await deleteDirectoryRecursive(targetPath);
      console.log(`成功递归删除文件夹：${targetPath}`);
    } else {
      console.error(`错误：目标 "${targetPath}" 既不是文件也不是文件夹`);
      process.exit(1);
    }
  } catch (err) {
    if (err.code === 'ENOENT') {
      console.error(`错误：目标 "${targetPath}" 不存在`);
    } else {
      console.error(`错误：删除失败\n原因：${err.message}`);
    }
    process.exit(1);
  }
}

// 3. 辅助函数：删除单个文件（异步封装，支持await）
function deleteFile(filePath) {
  return new Promise((resolve, reject) => {
    fs.unlink(filePath, (err) => {
      err ? reject(err) : resolve();
    });
  });
}

// 4. 辅助函数：递归删除文件夹（先删子内容，再删自身）
async function deleteDirectoryRecursive(dirPath) {
  // 读取文件夹内所有子项（文件/子文件夹）
  const items = fs.readdirSync(dirPath);

  // 遍历所有子项，逐一删除
  for (const item of items) {
    const itemPath = path.join(dirPath, item);
    const itemStats = fs.statSync(itemPath);

    if (itemStats.isFile()) {
      // 子项是文件：直接删除
      await deleteFile(itemPath);
      console.log(`已删除文件：${itemPath}`);
    } else if (itemStats.isDirectory()) {
      // 子项是文件夹：递归删除
      await deleteDirectoryRecursive(itemPath);
      console.log(`已删除空文件夹：${itemPath}`);
    }
  }

  // 所有子项删除完成后，删除当前空文件夹
  return new Promise((resolve, reject) => {
    fs.rmdir(dirPath, (err) => {
      err ? reject(err) : resolve();
    });
  });
}

// 启动删除流程
deleteTarget();